//? call
Function.prototype.myCall = function (obj, ...args) {
    //? obj是执行环境
    //? 判断obj是否为null或undefined 是的话把globalThis赋给他
    !obj && (obj = globalThis)
    //? 把方法添加成属性 这个this就是调用call的方法/函数
    obj._fn = this
    //? 在this指向obj的环境中执行该函数
    const res = obj._fn(...args)
    //? 执行完了删掉
    delete obj._fn
    //? 返回执行结果
    return res
}
//? apply
Function.prototype.myApply = function (obj, args) {
    !obj && (obj = globalThis)
    obj._fn = this
    const res = obj._fn(...args)
    delete obj._fn
    return res
}

//? bind
Function.prototype.myBind = function (obj, ...args1) {
    !obj && (obj = globalThis)
    //? 因为箭头函数没有this 要向外找 找到了调用的add函数 否则使用普通函数则是返回的这个函数了
    return (...args2) => {
        console.log(this)
        obj._fn = this
        const res = obj._fn(...[...args1, ...args2])
        delete obj._fn;
        return res;
    }
}
let a = {
    b : 1
}
function add(a, b) {
    return a + b
}

console.log(add.myCall(a, 1, 2));
console.log(add.myApply(a, [1, 2]));
console.log(add.myBind(a, 1)(2));
